{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# `Gua.ToBytes` 的实现细节"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用 `Gua.ToBytes` 和 `Gua.FromBytes` 可以在 `Gua` 和 `byte[]` 之间相互转换。\n",
    "\n",
    "此页面是介绍它的实现细节的，通常来说可能不需要阅读此页。因为这种转换一般不需要使用，即使使用，也不需要关注得到的 `byte[]` 具体是什么值，只需要知道它可以正确还原就足够了。\n",
    "\n",
    "在转换时，会使用 `1` 表示阳、 `0` 表示阴，越低位所表示的爻也越在下（所谓上下即常用的卦画的上下）。由于爻的个数是不确定的，在最高位会额外写一个 `1` 以表示解析的起点（也可以叫终点）。\n",
    "\n",
    "举例而言，兑卦“阳阳阴”，转为数字得 `[1, 1, 0]`（左侧是低位，右侧是高位）；然后最高位添一，得 `[1, 1, 0, 1]`；填充为八的整数倍，得 `[1, 1, 0, 1, 0, 0, 0, 0]`，这就是最后的结果了。但常规的数字写法是左高右低的，即得到的是 `[0b0000_1011]`。\n",
    "\n",
    "又如“阳阳阳阴阳阳阳阳阳”：\n",
    "\n",
    "```text\n",
    "   阳阳阳阴 阳阳阳阳 阳\n",
    "-> 1,1,1,0, 1,1,1,1, 1\n",
    "-> 1,1,1,0, 1,1,1,1, 1,1 \n",
    "-> (1110 1111) (1100 0000)\n",
    "-> 0b0000_0011 at bytes[1]\n",
    "   0b1111_0111 at bytes[0]\n",
    "-> [0b1111_0111, 0b0000_0011]\n",
    "      8765 4321           |9\n",
    "```\n",
    "\n",
    "以上就是关于 `Gua.ToBytes` 的所有内容了。其中需要注意，最高位的 `1` 表示结束，而不是一根爻，因此比如在取错卦时，不能把它取反。同时，由于书写习惯，最低位的爻是整个数组最左侧值的最右侧，需要稍加注意。\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "file_extension": ".cs",
   "mimetype": "text/x-csharp",
   "name": "python",
   "pygments_lexer": "csharp",
   "version": "3.12.2"
  },
  "polyglot_notebook": {
   "kernelInfo": {
    "defaultKernelName": "csharp",
    "items": [
     {
      "aliases": [],
      "name": "csharp"
     }
    ]
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
